home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 24 / CU Amiga Magazine's Super CD-ROM 24 (1998)(EMAP Images)(GB)(Track 1 of 2)[!][issue 1998-07].iso / CUCD / Programming / SWI / 68000 / lib / topvars.pl < prev    next >
Encoding:
Text File  |  1994-11-04  |  2.3 KB  |  102 lines

  1. /*  $Id: topvars.pl,v 1.1 1994/11/04 14:18:02 jan Exp $
  2.  
  3.     Part of XPCE
  4.     Designed and implemented by Anjo Anjewierden and Jan Wielemaker
  5.     E-mail: jan@swi.psy.uva.nl
  6.  
  7.     Copyright (C) 1994 University of Amsterdam. All rights reserved.
  8. */
  9.  
  10. :- module(toplevel_variables,
  11.       [ print_toplevel_variables/0
  12.       , verbose_expansion/1
  13.       ]).
  14.  
  15. :- dynamic
  16.     toplevel_var/2,
  17.     verbose/0.
  18.  
  19. :- op(100, fx, $).
  20.  
  21. expand_query(Query, Expanded, Bindings, ExpandedBindings) :-
  22.     expand_vars(Bindings, Query, Expanded),
  23.     delete_bound_vars(Bindings, ExpandedBindings),
  24.     (   verbose,
  25.         Query \== Expanded
  26.     ->  print_query(Expanded, ExpandedBindings)
  27.     ;   true
  28.     ).
  29.  
  30. expand_vars(_, Var, Var) :-
  31.     var(Var), !.
  32. expand_vars(Bindings, $(Var), Value) :-
  33.     bind_var(Var, Bindings),
  34.     (   toplevel_var(Var, Value)
  35.     ->  !
  36.     ;   $warning('~w: No such variable')
  37.     ).
  38. expand_vars(Bindings, Term, Expanded) :-
  39.     functor(Term, Name, Arity), !,
  40.     functor(Expanded, Name, Arity),
  41.     End is Arity + 1,
  42.     expand_args(1, End, Bindings, Term, Expanded).
  43. expand_vars(_, Term, Term).
  44.  
  45.  
  46. expand_args(End, End, _, _, _) :- !.
  47. expand_args(Arg0, End, Bindings, T0, T) :-
  48.     arg(Arg0, T0, V0),
  49.     expand_vars(Bindings, V0, V1),
  50.     arg(Arg0, T, V1),
  51.     Arg1 is Arg0 + 1,
  52.     expand_args(Arg1, End, Bindings, T0, T).
  53.  
  54. bind_var(Var, [VarName = TheVar|_]) :-
  55.     Var == TheVar, !,
  56.     Var = VarName.
  57. bind_var(Var, [_|T]) :-
  58.     bind_var(Var, T).
  59.  
  60.  
  61. delete_bound_vars([], []).
  62. delete_bound_vars([H|T0], [H|T]) :-
  63.     H = (_Name = Value),
  64.     var(Value), !,
  65.     delete_bound_vars(T0, T).
  66. delete_bound_vars([_|T0], T1) :-
  67.     delete_bound_vars(T0, T1).
  68.  
  69.  
  70. expand_answer(Bindings, Bindings) :-
  71.     assert_bindings(Bindings).
  72.  
  73. assert_bindings([]).
  74. assert_bindings([Var = Value|Tail]) :-
  75.     retractall(toplevel_var(Var, _)),
  76.     assert(toplevel_var(Var, Value)),
  77.     assert_bindings(Tail).
  78.       
  79.  
  80. print_toplevel_variables :-
  81.     toplevel_var(Name, Value),
  82.     format('$~w =~t~12|~p~n', [Name, Value]),
  83.     fail.
  84. print_toplevel_variables :-
  85.     toplevel_var(_, _), !.
  86. print_toplevel_variables :-
  87.     format('No defined toplevel variables~n').
  88.  
  89.  
  90. verbose_expansion(on) :- !,
  91.     retractall(verbose),
  92.     asserta(verbose).
  93. verbose_expansion(off) :-
  94.     retractall(verbose).
  95.  
  96.  
  97. :- user:assert((expand_query(A, B, C, D) :-
  98.            toplevel_variables:(expand_query(A, B, C, D)))).
  99. :- user:assert((expand_answer(A, B) :-
  100.            toplevel_variables:(expand_answer(A, B)))).
  101.  
  102.